/*  
    需求：订阅发布方发布的消息，并输出到终端。
    步骤：
        1.包含头文件；
        2.初始化 ROS2 客户端；
        3.定义节点类；
            3-1.创建订阅方；
            3-2.处理订阅到的消息。
        4.调用spin函数，并传入节点对象指针；
        5.释放资源。
*/

// 1.包含头文件；
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

using std::placeholders::_1;
using std_msgs::msg::String;

// 3.定义节点类；
class Listener : public rclcpp::Node
{
  public:
    Listener()
    : Node("listener_node_cpp")
    {
      // 3-1.创建订阅方；
      subscription_ = this->create_subscription<String>("chatter", 10, std::bind(&Listener::topic_callback, this, _1));
    }

  private:
    // 3-2.处理订阅到的消息；
    void topic_callback(const String::SharedPtr msg) const
    {
      RCLCPP_INFO(this->get_logger(), "订阅的消息： '%s'", msg->data.c_str());
    }
    rclcpp::Subscription<String>::SharedPtr subscription_;
};

int main(int argc, char * argv[])
{
  // 2.初始化 ROS2 客户端；
  rclcpp::init(argc, argv);
  // 4.调用spin函数，并传入节点对象指针。
  rclcpp::spin(std::make_shared<Listener>());
  // 5.释放资源；
  rclcpp::shutdown();
  return 0;
}


